React: Kapsamlı Rehber ve Alternatifler [2026 Güncel İnceleme]
Yazar: Burak Balkı | Kategori: Backend Development | Okuma Süresi: 49 dk
React, 2026'da frontend geliştirmenin lideri olmaya devam ediyor. Bu kapsamlı rehber, React'ın temellerini, alternatifleriyle karşılaştırmasını, ileri seviye...
# React: Kapsamlı Rehber ve Alternatifler [2026 Güncel İnceleme]
Web geliştirme dünyası, 2026 itibarıyla hızla evrilmeye devam ediyor ve kullanıcı arayüzlerinin (UI) oluşturulmasında React, hala sektörün önde gelen teknolojilerinden biri olarak konumunu koruyor. Modern, interaktif ve ölçeklenebilir web uygulamaları geliştirmek isteyen her developer'ın yolunun kesiştiği bu JavaScript kütüphanesi, sunduğu esneklik ve geniş ekosistemle fark yaratıyor. Peki, **React nedir**, neden bu kadar popüler ve 2026'da alternatifleriyle kıyaslandığında hangi noktalarda öne çıkıyor? Bu kapsamlı rehberde, React'ın temellerinden ileri seviye kullanımına, performans optimizasyonundan gerçek dünya proje örneklerine kadar her şeyi detaylıca inceleyeceğiz. Hedefimiz, hem yeni başlayanlara yol göstermek hem de deneyimli geliştiricilerin React bilgi birikimini 2026 standartlarına taşımak.
## React Nedir?
React, Facebook tarafından geliştirilen, kullanıcı arayüzleri (UI) oluşturmak için kullanılan açık kaynaklı bir JavaScript kütüphanesidir. 2026 itibarıyla component tabanlı mimarisiyle hızlı ve ölçeklenebilir web uygulamaları geliştirmeyi sağlar, özellikle single-page application'lar ve mobil uygulamalar için tercih edilir. React, deklaratif bir yaklaşımla UI'ları yönetir, yani geliştiriciler uygulamanın durumunu tanımlar ve React, bu duruma göre UI'ı otomatik olarak günceller.
React'ın kalbinde, uygulamanın görsel parçalarını temsil eden **component'ler** bulunur. Bu component'ler, kendi içlerinde durum (state) ve özellikler (props) barındırabilirler. Sanal DOM (Virtual DOM) adı verilen özel bir mekanizma sayesinde, React sadece değişen UI kısımlarını güncelleyerek yüksek performans sunar. Bu, özellikle büyük ve karmaşık uygulamalarda kullanıcı deneyimini önemli ölçüde iyileştirir. React'ın basit ama güçlü felsefesi, onu 2026'da da modern web geliştirme için vazgeçilmez bir araç haline getiriyor.
## Neden React Kullanmalısınız?
React, 2026 yılı itibarıyla birçok projenin tercih sebebi olmaya devam ediyor. Bu popülerliğin arkasında yatan temel nedenleri ve React'ın sunduğu değer önerilerini maddeler halinde inceleyelim:
* **Component Tabanlı Mimari:** Uygulamanızı küçük, yeniden kullanılabilir ve bağımsız parçalara bölmenizi sağlar. Bu, kodun okunabilirliğini, bakımını ve ölçeklenebilirliğini artırır. Bir component'i birden fazla yerde kullanmak, geliştirme süresini kısaltır ve tutarlılık sağlar.
* **Yüksek Performans (Virtual DOM):** React, gerçek DOM yerine bellekte bir Sanal DOM kopyası tutar. Durum değişikliklerinde, sadece değişen kısımları hesaplar ve gerçek DOM'a minimum sayıda güncelleme gönderir. Bu sayede, özellikle yoğun veri güncellemeleri olan uygulamalarda gözle görülür bir performans artışı elde edilir.
* **Deklaratif Yaklaşım:** UI'ın nasıl değişeceğini adımlar halinde belirtmek yerine, sadece uygulamanın belirli bir durumda nasıl görünmesi gerektiğini tanımlarsınız. React, bu durumu DOM'a yansıtma işini üstlenir. Bu, kodun daha öngörülebilir ve hata ayıklamasının daha kolay olmasını sağlar.
* **Geniş Ekosistem ve Topluluk Desteği:** React, dünya genelinde en geniş geliştirici topluluklarından birine sahiptir. Bu, Stack Overflow, GitHub ve çeşitli forumlarda hızlıca destek bulabileceğiniz anlamına gelir. Ayrıca, state yönetimi (Redux, Zustand), routing (React Router), form yönetimi (Formik, React Hook Form) gibi birçok konuda zengin bir kütüphane ve araç ekosistemi sunar. 2026 itibarıyla, bu ekosistem sürekli büyümekte ve güncellenmektedir.
* **Tek Yönlü Veri Akışı:** Verilerin tek bir yönde akması, uygulamanın durumunu yönetmeyi basitleştirir ve hata ayıklamayı kolaylaştırır. Component'ler sadece kendilerine iletilen props'ları değiştirebilir veya kendi iç durumlarını güncelleyebilir.
* **React Native ile Mobil Geliştirme:** React bilginizi iOS ve Android mobil uygulamalar geliştirmek için kullanabilirsiniz. Bu, web ve mobil ekipleri arasında kod paylaşımını ve öğrenme eğrisini azaltır.
**Hangi Problemleri Çözer?**
React, özellikle aşağıdaki problemlerin çözümü için idealdir:
* **Karmaşık ve Dinamik UI'lar:** Facebook, Instagram gibi uygulamaların ihtiyaç duyduğu yüksek interaktiviteye sahip arayüzler.
* **Ölçeklenebilirlik:** Büyük ekiplerin birlikte çalışabileceği, binlerce component'ten oluşan uygulamalar.
* **Performans Kaygıları:** Veri yoğun uygulamalarda akıcı kullanıcı deneyimi sağlama.
**Kimler İçin Uygun, Kimler İçin Değil?**
* **Uygun:** Single-page application (SPA) geliştirenler, interaktif dashboard'lar, mobil uygulama geliştirenler (React Native ile), büyük ölçekli kurumsal uygulamalar.
* **Değil:** Çok basit, statik web siteleri (bu durumda vanilla JavaScript veya daha hafif kütüphaneler yeterli olabilir), SEO'nun çok kritik olduğu blog siteleri (sunucu taraflı renderlama – SSR – veya statik site oluşturma – SSG – teknikleri kullanılmadığı sürece).
> **Deneyim Notu:** Production ortamında React ile çalıştığım onca yılda, özellikle büyük ölçekli projelerde component tabanlı yapının ve Virtual DOM'un getirdiği verimliliğin paha biçilemez olduğunu gördüm. Ekibimizde React'a geçiş sürecinde, başlangıçtaki öğrenme eğrisine rağmen, uzun vadede geliştirme hızımızda ve kod kalitemizde önemli artışlar kaydettik.
## React vs Alternatifler [2026 Karşılaştırması]
React, modern frontend geliştirmenin en popüler seçeneklerinden biri olsa da, piyasada güçlü alternatifleri de bulunmaktadır. 2026 itibarıyla öne çıkan iki ana rakibi Vue.js ve Svelte.js ile React'ı karşılaştıralım.
| Özellik | React (v19.x/20.x - 2026) | Vue.js (v3.x/4.x - 2026) | Svelte.js (v5.x - 2026) |
| :----------------- | :--------------------------------------------------------- | :-------------------------------------------------------- | :---------------------------------------------------------- |
| **Felsefe** | Kütüphane, UI oluşturmaya odaklı, esnek. | Framework, daha opinionated, kolay entegrasyon. | Compiler, build zamanında saf JavaScript'e derler. |
| **Performans** | Virtual DOM, akıllı diff algoritmaları ile yüksek performans. | Virtual DOM, React'a benzer performans. | Gerçek DOM'u doğrudan manipüle eder, genellikle en hızlı. |
| **Öğrenme Eğrisi** | Orta, JavaScript bilgisi ve Hooks kavramı gerektirir. | Düşük, HTML/CSS/JS bilenler için hızlı başlangıç. | Düşük, JavaScript bilgisi yeterli, reaktiflik kolay anlaşılır. |
| **Ekosistem** | En geniş ve olgun ekosistem, çok sayıda kütüphane ve araç. | Geniş ve büyüyen ekosistem, Çin'de özellikle popüler. | Daha küçük ama hızla büyüyen ekosistem, yeni nesil araçlar. |
| **Topluluk** | En büyük ve en aktif global topluluk. | Büyük ve aktif topluluk, özellikle Asya'da güçlü. | Hızla büyüyen, tutkulu ve destekleyici bir topluluk. |
| **Kurumsal Destek**| Facebook tarafından destekleniyor, birçok büyük şirket kullanıyor. | Bağımsız geliştiriciler ve şirketler tarafından destekleniyor. | Bağımsız geliştiriciler tarafından destekleniyor, şirket benimsemesi artıyor. |
| **Kullanım Alanı** | Büyük ölçekli SPA'lar, mobil uygulamalar, karmaşık UI'lar. | Küçükten büyüğe her türlü proje, kolay entegrasyon. | Performans kritik uygulamalar, küçük bundle boyutları. |
Her üç teknoloji de 2026 itibarıyla modern web geliştirmenin temelini oluşturmaktadır ve seçim, projenin özel ihtiyaçlarına, ekibin deneyimine ve performans gereksinimlerine göre değişmelidir. React, esnekliği ve geniş kaynaklarıyla öne çıkarken, Vue.js öğrenme kolaylığı ve entegrasyonuyla, Svelte.js ise üstün performansıyla dikkat çekmektedir.
## Kurulum ve İlk Adımlar
React projesi başlatmak, 2026 itibarıyla `create-react-app` veya `Vite` gibi araçlarla oldukça basittir. Vite, daha hızlı kurulum ve geliştirme sunması nedeniyle son yıllarda popülerliğini artırmıştır. Bu bölümde, Vite kullanarak bir React projesi nasıl başlatılacağını adım adım göreceğiz.
**Ön Gereksinimler:**
React projesi geliştirmeye başlamadan önce sisteminizde aşağıdaki yazılımların yüklü olduğundan emin olun:
* **Node.js:** En az 20.x LTS veya 22.x LTS sürümü (2026 itibarıyla önerilen sürümler). Node.js'i [resmi sitesinden](https://nodejs.org/en/download/) indirebilirsiniz.
* **npm** (Node Package Manager) veya **Yarn:** Node.js ile birlikte gelirler.
**Adım 1: Yeni Bir React Projesi Oluşturma (Vite ile)**
Terminalinizi açın ve aşağıdaki komutu çalıştırın. `my-react-app-2026` yerine projenizin adını yazabilirsiniz.
```bash
npm create vite@latest my-react-app-2026 -- --template react
```
Bu komut, size birkaç soru sorabilir (örneğin, JavaScript veya TypeScript kullanmak isteyip istemediğiniz). React için varsayılan seçenekleri seçebilirsiniz.
**Adım 2: Proje Dizinine Gitme**
Oluşturulan proje dizinine geçmek için aşağıdaki komutu kullanın:
```bash
cd my-react-app-2026
```
**Adım 3: Bağımlılıkları Yükleme**
Projenin ihtiyaç duyduğu tüm bağımlılıkları yüklemek için:
```bash
npm install
```
**Adım 4: Geliştirme Sunucusunu Başlatma**
Uygulamanızı tarayıcıda görmek için geliştirme sunucusunu başlatın:
```bash
npm run dev
```
Bu komut genellikle `http://localhost:5173` (veya benzer bir port) adresinde uygulamanızı çalıştıracaktır. Tarayıcınızda bu adresi ziyaret ederek ilk React uygulamanızı görebilirsiniz.
**Basit Bir React Component'i:**
`src/App.jsx` dosyanızı açtığınızda aşağıdaki gibi bir yapı göreceksiniz. Bu, React'ın temel bir component'idir.
```javascript
// src/App.jsx
import { useState } from 'react';
import reactLogo from './assets/react.svg';
import viteLogo from '/vite.svg';
import './App.css';
function App() {
const [count, setCount] = useState(0);
return (
<>
);
}
export default App;
```
### 2. State Yönetimi (useState Hook'u)
**Problem:** Component içinde değişen verileri yönetmek ve bu değişikliklere göre UI'ı güncellemek.
**Çözüm:** `useState` Hook'u, functional component'lere state eklememizi sağlar.
```javascript
// src/components/Counter.jsx
import React, { useState } from 'react';
function Counter() {
// `count` mevcut state değeri, `setCount` bu değeri güncelleyen fonksiyon
const [count, setCount] = useState(0);
return (
);
}
export default Counter;
// src/App.jsx
import React from 'react';
import Counter from './components/Counter';
function App() {
return (
);
}
export default App;
```
### 3. Olay Yönetimi (Event Handling)
**Problem:** Kullanıcı etkileşimlerine (tıklama, klavye girişi vb.) tepki vermek.
**Çözüm:** React, elementlere doğrudan olay dinleyicileri (event listeners) atamamızı sağlar.
```javascript
// src/components/InputHandler.jsx
import React, { useState } from 'react';
function InputHandler() {
const [text, setText] = useState('');
const handleChange = (event) => {
setText(event.target.value);
};
const handleClick = () => {
alert(`Girdiğiniz metin: ${text}`);
setText(''); // Girişi temizle
};
return (
);
}
export default InputHandler;
// src/App.jsx
import React from 'react';
import InputHandler from './components/InputHandler';
function App() {
return (
);
}
export default App;
```
### 4. Liste Renderlama (Mapping)
**Problem:** Bir dizi veriyi dinamik olarak liste halinde göstermek.
**Çözüm:** `Array.prototype.map()` metodunu kullanarak her bir dizi elemanı için bir React elementi render ederiz. **`key` prop'u** bu noktada kritik öneme sahiptir.
```javascript
// src/components/ItemList.jsx
import React from 'react';
function ItemList(props) {
const items = ['Elma', 'Armut', 'Çilek', 'Muz'];
return (
);
}
export default App;
```
> **Pro Tip:** `key` prop'u her zaman benzersiz ve sabit olmalıdır. `index` kullanmak, listenin dinamik olarak değiştiği (ekleme, silme, sıralama) senaryolarda performansı olumsuz etkileyebilir veya hatalara yol açabilir. Mümkünse, verinin kendi benzersiz ID'sini kullanın.
## İleri Seviye Teknikler
React'ın temellerini anladıktan sonra, daha büyük ve karmaşık uygulamalar geliştirmek için ileri seviye tekniklere ihtiyaç duyulur. 2026 itibarıyla modern React uygulamalarında sıkça karşılaşılan bazı önemli konuları inceleyelim.
### 1. Global State Yönetimi (Context API ve Harici Kütüphaneler)
**Problem:** Birden fazla component'in aynı state'e erişmesi veya güncellemesi gerektiğinde `prop drilling` (props'ları aradaki birçok component'ten geçirme) sorununu aşmak.
**Çözüm:** React'ın kendi **Context API**'ı veya **Redux**, **Zustand** gibi harici state yönetim kütüphaneleri kullanılır.
**Context API Örneği:**
```javascript
// src/contexts/ThemeContext.jsx
import React, { createContext, useState, useContext } from 'react';
// 1. Context'i oluştur
export const ThemeContext = createContext();
// 2. Provider component'ini oluştur
export const ThemeProvider = ({ children }) => {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
};
return (
{children}
);
};
// 3. Custom Hook ile kolayca kullan
export const useTheme = () => useContext(ThemeContext);
// src/components/ThemeToggler.jsx
import React from 'react';
import { useTheme } from '../contexts/ThemeContext';
function ThemeToggler() {
const { theme, toggleTheme } = useTheme();
return (
);
}
export default ThemeToggler;
// src/App.jsx
import React from 'react';
import { ThemeProvider } from './contexts/ThemeContext';
import ThemeToggler from './components/ThemeToggler';
function App() {
return (
);
}
export default App;
```
### 2. Custom Hooks Oluşturma
**Problem:** Component'ler arasında tekrar eden mantığı (stateful logic) paylaşmak.
**Çözüm:** Kendi özel Hook'larımızı oluşturarak bu mantığı soyutlarız ve yeniden kullanılabilir hale getiririz.
```javascript
// src/hooks/useWindowWidth.js
import { useState, useEffect } from 'react';
function useWindowWidth() {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
const handleResize = () => setWidth(window.innerWidth);
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []); // Sadece bir kere mount edildiğinde çalışır
return width;
}
export default useWindowWidth;
// src/components/WindowSizeDisplay.jsx
import React from 'react';
import useWindowWidth from '../hooks/useWindowWidth';
function WindowSizeDisplay() {
const windowWidth = useWindowWidth();
return (
);
}
export default WindowSizeDisplay;
// src/App.jsx
import React from 'react';
import WindowSizeDisplay from './components/WindowSizeDisplay';
function App() {
return (
);
}
export default App;
```
### 3. Router Kullanımı (React Router v6.x)
**Problem:** Tek sayfalık uygulamalarda (SPA) farklı URL'lere göre farklı component'leri göstermek ve navigasyon sağlamak.
**Çözüm:** React Router gibi bir kütüphane kullanılır. 2026 itibarıyla React Router'ın 6.x sürümü yaygın olarak kullanılmaktadır.
Önce yükleyin:
```bash
npm install react-router-dom@6
```
Sonra kullanın:
```javascript
// src/App.jsx
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
function Home() {
return
} />
} />
} />
} /> {/* Geçersiz yollar için */}
);
}
export default App;
```
Bu ileri seviye teknikler, React uygulamalarınızı daha organize, daha yönetilebilir ve daha performanslı hale getirmenize yardımcı olacaktır. 2026'da büyük ölçekli ve kurumsal projelerde bu tekniklerin ustaca kullanılması beklenmektedir.
## Best Practices & Anti-Patterns
React geliştirirken, kod kalitesini, performansı ve sürdürülebilirliği artırmak için belirli en iyi uygulamaları takip etmek hayati önem taşır. Aynı şekilde, kaçınılması gereken anti-pattern'leri bilmek de olası sorunları önler. 2026 itibarıyla geçerli olan bazı kritik best practice'ler ve anti-pattern'ler şunlardır:
### ✅ Best Practices (Yapılması Gerekenler)
1. **Component'leri Küçük ve Odaklı Tutun:**
* **Neden:** Her component'in tek bir sorumluluğu olmalı (Single Responsibility Principle). Bu, component'lerin daha kolay test edilebilir, yeniden kullanılabilir ve bakımı yapılabilir olmasını sağlar.
* **Örnek:** Bir `ProductCard` component'i sadece ürün bilgilerini göstermeli, ürün listesini yönetmemelidir.
2. **Hooks'u Doğru Kullanın:**
* **Neden:** Hooks (özellikle `useState`, `useEffect`, `useContext`, `useCallback`, `useMemo`), functional component'lerde state ve lifecycle yönetimi için güçlü araçlardır. Custom Hooks ile tekrar eden mantığı soyutlayın.
* **Örnek:** Veri çekme mantığını bir `useFetch` custom hook'u içine alın.
3. **Immutable State Kullanın:**
* **Neden:** React, state'in değişip değişmediğini referans karşılaştırması yaparak anlar. Nesneleri veya dizileri doğrudan değiştirmek yerine, yeni bir kopya oluşturarak güncelleyin. Bu, beklenmedik hataları ve render sorunlarını önler.
* **Örnek:** `setArray([...prevArray, newItem])` veya `setObject({...prevObject, newProp: value})`.
4. **`key` Prop'unu Doğru Kullanın:**
* **Neden:** Liste renderlarken her elemana benzersiz ve sabit bir `key` prop'u vermek, React'ın liste öğelerini verimli bir şekilde güncellemesine yardımcı olur. `index` kullanmaktan kaçının, özellikle liste öğeleri değişiyorsa veya yeniden sıralanıyorsa.
* **Örnek:** `data.map(item => )`.
5. **Prop Drilling Yerine Context API veya State Yönetim Kütüphanesi Kullanın:**
* **Neden:** Çok derin component hiyerarşilerinde props'ları birkaç katman aşağıya indirmek (prop drilling) kodu karmaşıklaştırır ve bakımı zorlaştırır. Global state için Context API veya Redux/Zustand gibi kütüphaneler kullanın.
6. **Erişilebilirlik (Accessibility) Odaklı Geliştirin:**
* **Neden:** Tüm kullanıcıların (engelli kullanıcılar dahil) uygulamanızı rahatça kullanabilmesini sağlamak için `aria` etiketleri, semantik HTML ve klavye navigasyonunu destekleyin. Bu, aynı zamanda yasal uyumluluk ve daha geniş bir kullanıcı kitlesi anlamına gelir.
7. **Hata Sınırları (Error Boundaries) Kullanın:**
* **Neden:** Bir component ağacının herhangi bir yerinde meydana gelen JavaScript hatalarının tüm uygulamayı çökertmesini engellemek için hata sınırları tanımlayın. Bu, kullanıcı deneyimini iyileştirir.
8. **Formları Doğru Yönetin:**
* **Neden:** Form girişi ve validasyon, React uygulamalarında sıkça karşılaşılan bir durumdur. `controlled components` kullanarak input değerlerini React state'i ile eşleştirin veya Formik/React Hook Form gibi kütüphaneleri kullanın.
### ❌ Anti-Patterns (Kaçınılması Gerekenler)
1. **Doğrudan DOM Manipülasyonu:**
* **Neden:** React'ın Virtual DOM'u ve deklaratif yapısı, DOM'u doğrudan manipüle etmenizi gereksiz kılar. `document.getElementById` gibi yöntemler kullanmak, React'ın kontrolünü bozar ve beklenmedik davranışlara yol açar.
* **Çözüm:** `useRef` veya React state'i kullanarak UI'ı yönetin.
2. **Gereksiz Yeniden Render'lar:**
* **Neden:** Component'ler, parent component'leri render edildiğinde veya kendi state/props'ları değiştiğinde yeniden render olur. Gereksiz render'lar performansı düşürür. Özellikle büyük listelerde veya karmaşık component'lerde bu kritik olabilir.
* **Çözüm:** `React.memo`, `useCallback`, `useMemo` gibi optimizasyon Hook'larını kullanın.
3. **Component İçinde State Güncelleme Döngüleri:**
* **Neden:** `useEffect` içinde yanlış bağımlılıklar belirtmek veya render sırasında state güncellemek sonsuz döngülere yol açabilir (`Maximum update depth exceeded` hatası).
* **Çözüm:** `useEffect` bağımlılık dizisini doğru bir şekilde yönetin ve render sırasında state güncellemekten kaçının (ya da dikkatlice yapın).
4. **Büyük ve Tek Parçalı Component'ler (God Components):**
* **Neden:** Çok fazla sorumluluğu olan component'ler (birçok state, çok fazla JSX, birçok farklı işlevi barındıran) bakımı zorlaştırır, test edilebilirliği düşürür ve yeniden kullanılabilirliği engeller.
* **Çözüm:** Component'leri daha küçük, tek sorumluluklu parçalara ayırın.
5. **API Anahtarlarını veya Hassas Bilgileri Frontend'de Saklamak:**
* **Neden:** Tarayıcıda görünen herhangi bir bilgi (kaynak kodu dahil) herkese açıktır. Hassas bilgileri (API anahtarları, şifreler vb.) asla doğrudan frontend kodunda saklamayın.
* **Çözüm:** Bu tür bilgileri bir backend servisi üzerinden güvenli bir şekilde yönetin ve proxy kullanın.
Bu best practice'leri ve anti-pattern'leri takip etmek, 2026'da daha sağlam, performanslı ve sürdürülebilir React uygulamaları geliştirmenizi sağlayacaktır. Projelerimde bu kurallara uymanın uzun vadede ne kadar zaman ve emek kazandırdığını defalarca tecrübe ettim.
## Yaygın Hatalar ve Çözümleri
React geliştirme sürecinde, özellikle yeni başlayanların sıkça karşılaştığı bazı hatalar vardır. Bu hataları bilmek ve çözümlerini öğrenmek, geliştirme sürecinizi hızlandıracak ve sizi olası frustrasyonlardan koruyacaktır. İşte 2026 itibarıyla en sık karşılaşılan React hataları ve çözümleri:
### 1. `Maximum update depth exceeded` Hatası
* **Problem:** Bu hata, bir component'in kendini çok sık veya sonsuz bir döngüde yeniden render etmeye çalıştığında ortaya çıkar. Genellikle `useState` veya `useEffect` Hook'larının yanlış kullanımıyla ilişkilidir.
* **Sebep:** En yaygın sebep, bir event handler'a doğrudan bir fonksiyon çağrısı (`onClick={handleClick()}`) atamak veya `useEffect` bağımlılık dizisini yanlış ayarlamaktır, bu da her render'da state'in güncellenmesine ve yeni bir render'ı tetiklemesine neden olur.
* **Çözüm:**
* Event handler'lara fonksiyon referansı verin: `onClick={handleClick}` veya `onClick={() => handleClick()}`.
* `useEffect` Hook'unun bağımlılık dizisini (`[]`) doğru kullanın. Eğer bir Hook sadece bir kere çalışmalıysa boş bir dizi verin. Eğer belirli değişkenler değiştiğinde çalışmalıysa, o değişkenleri diziye ekleyin.
```javascript
// Yanlış (sonsuz döngü)
//
// Doğru
// Yanlış useEffect bağımlılığı
// useEffect(() => { // Her render'da tekrar çalışır
// setSomeState(someValue);
// });
// Doğru useEffect (sadece mount'ta bir kere)
useEffect(() => {
// ...
}, []);
// Doğru useEffect (sadece dependency değiştiğinde)
useEffect(() => {
// ...
}, [dependency1, dependency2]);
```
### 2. `Objects are not valid as a React child` Hatası
* **Problem:** JSX içinde doğrudan bir JavaScript nesnesini veya dizisini render etmeye çalıştığınızda bu hatayı alırsınız.
* **Sebep:** React, JSX içinde sadece string, number, React elementleri veya null/undefined gibi render edilebilir tipleri kabul eder. Nesneler ve diziler doğrudan render edilemez.
* **Çözüm:** Nesnenin veya dizinin render etmek istediğiniz belirli bir özelliğini (örneğin `user.name`) gösterin veya `.map()` metodunu kullanarak dizinin her bir elemanını bir React elementine dönüştürün.
```javascript
// Yanlış
// const user = { name: 'Burak', age: 30 };
// return ` elementleri) render edildiğinde her bir elemana benzersiz bir `key` prop'u atanmadığında React bu uyarıyı verir.
* **Sebep:** `key` prop'u, React'ın liste öğelerini verimli bir şekilde tanımlamasına, eklemesine, silmesine ve güncellemesine yardımcı olur. Benzersiz bir `key` olmadan React, hangi öğenin değiştiğini takip etmekte zorlanır, bu da performans sorunlarına ve hatalı UI güncellemelerine yol açabilir.
* **Çözüm:** Mümkünse, listenizdeki her öğe için verinin kendi benzersiz ID'sini `key` olarak kullanın. Eğer benzersiz bir ID yoksa, nadiren değişen veya hiç değişmeyen statik listeler için `index`'i geçici olarak kullanabilirsiniz, ancak bu önerilmez.
```javascript
// Yanlış (index kullanmak dinamik listelerde sorun çıkarabilir)
// items.map((item, index) => {item} )
// Doğru (veri ID'si kullanın)
const products = [
{ id: 'p1', name: 'Laptop' },
{ id: 'p2', name: 'Mouse' },
];
return (
Vite + React
Edit src/App.jsx and save to test HMR
Click on the Vite and React logos to learn more
> ); } export default App; ``` Bu basit `App` component'i, `useState` Hook'unu kullanarak bir `count` değişkenini yönetir ve bir butona tıklandığında bu değeri artırır. İşte React'ın temel reaktivite prensibi bu kadar basittir. ## Temel Kullanım ve Örnekler React'ın gücü, component'ler ve Hooks aracılığıyla dinamik ve etkileşimli kullanıcı arayüzleri oluşturabilmesinden gelir. Bu bölümde, React'ın temel yapı taşlarını ve yaygın kullanım senaryolarını pratik örneklerle inceleyeceğiz. ### 1. Props ile Veri Aktarımı **Problem:** Bir üst component'ten alt component'e veri göndermek. **Çözüm:** `props` (properties) kullanarak verileri tek yönlü olarak aktarırız. ```javascript // src/components/Greeting.jsx import React from 'react'; function Greeting(props) { returnMerhaba, {props.name}!
; } export default Greeting; // src/App.jsx import React from 'react'; import Greeting from './components/Greeting'; function App() { return (Mevcut Sayı: {count}
Sayaç Uygulaması
Canlı Girdi: {text}
Girdi Yöneticisi
-
{items.map((item, index) => (
// `key` prop'u her liste elemanı için benzersiz olmalıdır.
// Genellikle veri ID'si kullanılır, burada basitlik için index kullandık.
- {item} ))}
Meyve Listesi
Tema Yönetimi
Uygulama genelinde tema değişimi.
Pencere Genişliği: {windowWidth}px
Custom Hook Örneği
Anasayfa
; } function About() { returnHakkımızda
; } function Contact() { returnİletişim
; } function NotFound() { return404 - Sayfa Bulunamadı
; } function App() { return ({user}
; // Hata verir
// Doğru
const user = { name: 'Burak', age: 30 };
return Kullanıcı Adı: {user.name}
;
// Dizi örneği
const items = ['Elma', 'Armut'];
return (
-
{items.map((item, index) => (
- {item} ))}
-
{products.map((product) => (
- {product.name} ))}